import os
import base64
from typing import Tuple

class FileHandler:
    """处理加密和解密的文件操作。"""
    
    @staticmethod
    def read_file(file_path: str) -> Tuple[bytes, str]:
        """
        读取文件内容并判断是文本还是二进制文件。
        
        参数:
            file_path: 要读取的文件路径
            
        返回:
            tuple: (文件内容的字节形式, 文件类型字符串)
        """
        try:
            # 首先尝试作为文本读取
            with open(file_path, 'r', encoding='utf-8') as f:
                content = f.read()
                return content.encode('utf-8'), 'text'
        except UnicodeDecodeError:
            # 如果失败，则作为二进制读取
            with open(file_path, 'rb') as f:
                content = f.read()
                return content, 'binary'
    
    @staticmethod
    def write_file(file_path: str, content: bytes, file_type: str):
        """
        将内容写入文件。
        
        参数:
            file_path: 要写入的文件路径
            content: 要写入的内容
            file_type: 'text' 或 'binary'
        """
        mode = 'w' if file_type == 'text' else 'wb'
        with open(file_path, mode) as f:
            if file_type == 'text':
                f.write(content.decode('utf-8'))
            else:
                f.write(content)
    
    @staticmethod
    def save_encrypted(file_path: str, encrypted_data: str, is_text: bool = True):
        """
        将加密数据保存到文件，包含元数据。
        
        参数:
            file_path: 保存加密文件的路径
            encrypted_data: Base64编码的加密数据
            is_text: 原始文件是否为文本
        """
        metadata = {
            'is_text': is_text,
            'data': encrypted_data
        }
        
        with open(file_path, 'w') as f:
            import json
            json.dump(metadata, f)
    
    @staticmethod
    def load_encrypted(file_path: str) -> Tuple[str, bool]:
        """
        从文件加载加密数据。
        
        参数:
            file_path: 加密文件的路径
            
        返回:
            tuple: (加密数据, 是否为文本标志)
        """
        with open(file_path, 'r') as f:
            import json
            metadata = json.load(f)
        return metadata['data'], metadata['is_text']